/**
 * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.smallchill.core.utils;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzKit {
	private final static String JOB_GROUP_NAME = "QUARTZ_JOBGROUP_NAME";// 任务组
	private final static String TRIGGER_GROUP_NAME = "QUARTZ_TRIGGERGROUP_NAME";// 触发器组
	private static SchedulerFactory sf = null;
	static {
		sf = new StdSchedulerFactory();
	}

	/**
	 * 添加任务的方法
	 * 
	 * @param jobName
	 *            任务名
	 * @param triggerName
	 *            触发器名
	 * @param jobClass
	 *            执行任务的类
	 * @param seconds
	 *            间隔时间
	 * @throws SchedulerException
	 */
	public static void addJob(String jobName, String triggerName, Class<? extends Job> jobClass, String time) throws SchedulerException {
		// 通过SchedulerFactory构建Scheduler对象
		Scheduler sche = sf.getScheduler();
		// 用于描叙Job实现类及其他的一些静态信息，构建一个作业实例
		JobDetail jobDetail = JobBuilder.newJob(jobClass)
				.withIdentity(jobName, JOB_GROUP_NAME).build();
		CronTrigger trigger = TriggerBuilder.newTrigger()
				.withIdentity(triggerName, TRIGGER_GROUP_NAME)
				.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
		// 向Scheduler中添加job任务和trigger触发器
		sche.scheduleJob(jobDetail, trigger);
		// 启动
		sche.start();
	}

	/**
	 * 删除job
	 * 
	 * @param jobName
	 */
	public static void removeJob(String jobName) {
		try {
			Scheduler sched = sf.getScheduler();
			TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_GROUP_NAME);
			sched.pauseTrigger(triggerKey);
			sched.unscheduleJob(triggerKey);
			sched.deleteJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	//  "1,2,3,40,50 * * * * ?"  //每分钟的第1,2,3,40,50秒执行  
	//  "1-30 * * * * ?"  // 在1-30中的每秒执行  
	//  "* * * * * ?"  // 每秒执行  
	//  "5/20 * * * * ?"  // 从第5秒开始执行后，每过20秒执行一次（一分钟内）。分别在5，25，45秒执行  
	//  "50 19 * * * ?"  // 每个小时的第19分钟50秒执行  
	//  "0 0/10 * * * ?"  // 每10分钟执行一次  
	//  "0 30 0/1 * * ?"  // 每小时的第30分钟执行  
	//  "0 38 15 * * ?"  // 每日的15:38分钟执行  
	//  "0 45 15 ? * MON-FRI"  // 每周周一至周五的15:45分执行  
	//  "0 47 15 ? * FRI"  // 每周五的15:47分执行  
	//  "0 50 15 ? * 6,7"  // 每周的周五和周六的15:47分执行  
	//  "0 31 16 6 6 ? *"  //每年的6月6号的16:31分执行  
	//  "0 33 16 6 * ?"  //每月的6号16:33分执行  
	//  "0 33 16 6 1,8 ?"  //每年第1月、8月 6号16:33执行 

}